"""
ConnLLM V2 工具调用处理器
处理工具调用相关的请求和响应
"""

from typing import Dict, Any, List, Optional
import logging

from .base import RequestProcessor

logger = logging.getLogger("connllm.core_v2.processors.tool_call")

class ToolCallProcessor(RequestProcessor):
	"""工具调用处理器"""
	
	def __init__(self, tool_call_capability):
		"""
		初始化处理器
		
		Args:
			tool_call_capability: 工具调用能力组件
		"""
		self.capability = tool_call_capability
	
	def process_request(self, params: Dict[str, Any], context: Dict[str, Any]) -> Dict[str, Any]:
		"""
		处理请求参数，添加工具定义
		
		Args:
			params: 请求参数
			context: 请求上下文
			
		Returns:
			处理后的请求参数
		"""
		return self.capability.prepare_request(params)
	
	def process_response(self, response: Any, context: Dict[str, Any]) -> Any:
		"""
		处理响应，检测工具调用
		
		Args:
			response: API响应
			context: 请求上下文
			
		Returns:
			处理后的响应
		"""
		# 检测工具调用
		tool_calls = self.capability.detect_tool_calls(response)
		
		# 如果有工具调用，保存到上下文中
		if tool_calls:
			logger.debug(f"检测到{len(tool_calls)}个工具调用")
			context["tool_calls"] = tool_calls
			context["original_response"] = response
			
			# 执行工具调用
			tool_results = self.capability.execute_tool_calls(tool_calls)
			context["tool_results"] = tool_results
		
		return response
	
	def should_retry_request(self, response: Any, context: Dict[str, Any]) -> bool:
		"""
		检查是否需要重试请求
		
		Args:
			response: API响应
			context: 请求上下文
			
		Returns:
			是否需要重试
		"""
		# 如果有工具调用结果，需要重试请求
		return "tool_results" in context and bool(context["tool_results"])
